iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Modern Web

前端幼鳥三十天養成記系列 第 21

let / const 細節版

  • 分享至 

  • xImage
  •  

var / let / const

  • var 關鍵字,聲明一個 function scope 變數
  • let關鍵字,聲明一個 block scope 變數
  • const關鍵字,聲明一個 block scope 常數
console.log('用var關鍵字 定義變數')
var i='全域變數';
console.log(`i=${i}`);  
//`i=${i}` 等價於 'i='+i 字串連接
// ` 反引號在~鍵上面 (我一開始還找不到,所以特別寫這行)

console.log("I'm in the function")
function fun(){
	var i='function內變數';
	console.log(`i=${i}`)
};
fun(); 
        
console.log("I'm out of the function")
console.log(`i=${i}`);  
        
console.log("I'm in the for loop")
for(var i=0;i<5;i++){
	console.log(`i=${i}`) 
}  //i=5離開for迴圈

console.log("I'm out of the for loop")
console.log(`i=${i}`); 

甚麼是 function scope,講人話就是:

var關鍵字令出的變數,他的有效範圍以function界定。

  • function外,聽 全域window
  • function內,聽function的,function內找不到變數,才往全域window

好的,那我們現在來對一下剛剛上面的答案。

用var關鍵字 定義變數
i=全域變數
I'm in the function
i=function內變數
I'm out of the function
i=全域變數
I'm in the for loop
i=0
i=1
i=2
i=3
i=4
I'm out of the for loop
i=5

離開for loop後,我們再次呼叫變數i,得到的答案是:5。

原因是for loop 不是function,會影響到在全域var定義的變數i

為了解決這個問題,我們有了letconst,他們的變數有效範圍以 {}界定。來看看他的效果~

console.log('用let關鍵字 定義變數')
let k='全域變數';
console.log(`k=${k}`);

console.log("I'm in the function")
function fun(){
	let k='function內變數';
	console.log(`k=${k}`)
};
fun();
        
console.log("I'm out of the function")
console.log(`k=${k}`);
        
console.log("I'm in the for loop")
for(let k=0;k<5;k++){
	console.log(`k=${k}`)
}
        
console.log("I'm out of the for loop")
console.log(`k=${k}`)
用let關鍵字 定義變數
k=全域變數
I'm in the function
k=function內變數
I'm out of the function
k=全域變數
I'm in the for loop
k=0
k=1
k=2
k=3
k=4
I'm out of the for loop
k=全域變數

這次我們離開for loop後,我們再次呼叫變數i,得到的答案是:全域變數。

因為變數i是用let定義的,他的變數有效範圍靠{}界定,而for loop 就有{}

var 和 let還有一個不同 - 重複宣告 會出的問題

let、const不能重複宣告,會報錯

var a=1
var a="haosjdoija";
let a=1
let a="haosjdoija";
//Uncaught SyntaxError: Identifier 'a' has already been declared

上一篇
Callback
下一篇
let宣告的全域變數,不再是全域屬性惹??
系列文
前端幼鳥三十天養成記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言